package com.zaki.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
@Slf4j
public class OperationLogAspect {

    //@Pointcut("execution(* com.zaki.springbootmybatis.service.impl.*.*(..))") //这个指定包下的
    @Pointcut("@annotation(com.zaki.aop.OperationLog)") //这个指定加了 @OperationLog 的方法
    public void pointCut(){

    }

    @Before("pointCut()")
    public void beforeMethod(JoinPoint joinPoint){
        //获取目标对象的类名
        String s1 =joinPoint.getTarget().getClass().getName();
        //获取目标对象的方法名
        String s2 =joinPoint.getSignature().getName();
        //获取目标对象运行时方法传入的参数
        Object[] args = joinPoint.getArgs();

        log.info("before----");
    }

    @Around("pointCut()") //切入点表达式，是指指定那个包下的类，那个类的方法需要记录时间
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        Long startTime =System.currentTimeMillis();
        //调用原始方法 //获取目标对象的返回值
        Object result =joinPoint.proceed();
        Long endTime =System.currentTimeMillis();
        log.info(joinPoint.getSignature()+"方法耗时:{}ms",(endTime-startTime));
        return result;
    }

    @After("pointCut()")
    public void afterMethod(){
        log.info("after----不管是否发生异常都会执行");
    }

    @AfterReturning("pointCut()")
    public void afterReturningMethod(){
        log.info("afterReturning----方法返回后才会执行，如果有异常则不执行");
    }

    @AfterThrowing("pointCut()")
    public void afterThrowingMethod(){
        log.info("afterThrowing----只有异常才会执行");
    }

}
